'use strict';

const path = require('path')
const semver = require('semver')
const colors = require('colors/safe')
const userHome = require('user-home')
const pathExists = require('path-exists').sync
const { Command } = require('commander')
const log = require('@zy-cli/log')
const exec = require('@zy-cli/exec')
const pkg = require('../package.json')
const contant = require('./contant')

const program = new Command()

async function core() {
    try {
        await prepare()
        registryCommand()
    } catch (error) {
        log.error(error.message)
        if (program.debug) {
            log.error(error)
        }
    }
}

async function prepare() {
    checkPkgVersion()
    checkRoot()
    checkUserHome()
    checkEnv()
    await checkGlobalUpdate()
}

// 注册命令
function registryCommand() {
    program
        .name(Object.keys(pkg.bin)[0])
        .usage('<command> [options]')
        .version(pkg.version)
        .option('-d, --debug', '是否开启调试模式', false)
        .option('-tp, --targetPath <targetPath>', '是否指定本地调试文件', '')
    
    program
        .command('init [projectName]')
        .option('-f, --force', '是否强制初始化')
        .action(exec)

    // 开启 debug 模式
    program.on('option:debug', function() {
        if (program.debug) {
            process.env.LOG_LEVEL = 'verbose'
        } else {
            process.env.LOG_LEVEL = 'info'
        }
        log.level = process.env.LOG_LEVEL
    })

    // 指定 targetPath
    program.on('option:targetPath', () => {
        process.env.CLI_TARGET_PATH = program.targetPath
    })
    // 监听未知命令
    program.on('command:*', function(operands) {
        log.error(`未知的命令：${operands[0]}`)
        const availabelCommands = program.commands.map(cmd => cmd.name())
        if (availabelCommands.length > 0) {
            console.log('可用的命令：', availabelCommands.join(','))
        }
        process.exit(1)
    })
    
    program.parse(process.argv)
    
    if (program.args && !program.args.length) {
        program.outputHelp()
        console.log()
    }
}
// 检查 package 版本
function checkPkgVersion() {
    log.info('cli', pkg.version)
}
// 检查 root 权限
function checkRoot() {
    const rootCheck = require('root-check')
    rootCheck()
}
// 检查用户主目录
function checkUserHome() {
    if (!userHome || !pathExists(userHome)) {
        throw new Error(colors.red('当前用户主目录不存在!'))
    }
}
// 检查环境变量
function checkEnv() {
    const dotenv = require('dotenv')
    const dotenvPath = path.resolve(userHome, '.env')
    if (pathExists(dotenvPath)) {
        dotenv.config({
            path: dotenvPath
        })
    }
    createDefaultConfig()
    log.verbose('环境变量', process.env.CLI_HOME_PATH)
}
// 创建默认配置
function createDefaultConfig() {
    const cliConfig = {
        home: userHome
    }
    if (process.env.CLI_HOME) {
        cliConfig['cliHome'] = path.join(userHome, process.env.CLI_HOME)
    } else {
        cliConfig['cliHome'] = path.join(userHome, contant.DEFAULT_CLI_HOME)
    }
    process.env.CLI_HOME_PATH = cliConfig.cliHome
}
// 检查全局版本
async function checkGlobalUpdate() {
    const currentVersion = pkg.version
    const npmName = pkg.name
    const { getNpmSemverVersions } = require('@zy-cli/get-npm-info')
    const lastVersion = await getNpmSemverVersions(currentVersion, npmName)
    if (lastVersion && semver.gt(lastVersion, currentVersion)) {
        log.warn('更新提示', colors.yellow(`请手动更新 ${npmName}，当前版本：${currentVersion}，最新版本：${lastVersion}  更新命令： npm install -g ${npmName}`))
    }
}

module.exports = core;

